package gui;

import logica.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.QuadCurve2D;
/**
**********************************************************************************************<br/>
* Grafica en el tablero de la interfaz las conexiones dadas por asociacion 
* @author Jefferson Amado Pe&ntilde;a Torres
**********************************************************************************************
* @see logica.Asociacion
* @see Tablero
* @see java.awt.Graphics2D
* @version 0.1
*/
public class AsociacionGrafica{
	private Relacion arista;
	private VerticeGrafico a, b;
	private Point inicial;  
	private Point terminal, ubicacionExt;
	private Color color = new Color(0, 128, 128), aux = Color.RED;
	private int tipo=0;
	private double costo;
	/**
	*Construye una asociacion grafica desde dos vertices 
	*
	*/
	public AsociacionGrafica(VerticeGrafico puntoA, VerticeGrafico puntoB,double costo){
		arista = new Relacion(puntoA.getNombre(), puntoB.getNombre(), costo);
			a = puntoA;
			b = puntoB;
			this.costo = costo;
	}
	/**
	*Grafica la linea entre dos coordenadas
	*@param ga Graphics del Tablero donde se va pintar
	*/
	public void pintarRecta(Graphics ga){
		inicial = a.getUbicacion();
		terminal = b.getUbicacion();
			Graphics2D g = (Graphics2D) ga;
			double a = (inicial.y - terminal.y);
			double b = (inicial.x - terminal.x);
			double m = a / b;
			double grado = Math.atan(m);
			//
			switch (tipo)
			{
			case 0:
			g.setColor(color);
			g.drawLine(inicial.x + 5, inicial.y + 5, terminal.x + 5, terminal.y + 5);
			g.setColor(aux);
			g.drawString( costo + "", (inicial.x + terminal.x) / 2, (inicial.y + terminal.y) / 2);
			break;

			case 1:
			g.setColor(color);
			g.drawOval(inicial.x - 10, inicial.y - 30, 30, 30);
			g.setColor(aux);
			g.drawString( costo + "", inicial.x - 3, inicial.y - 30);
			break;

			case 2:
			Point control = null;
			if (grado > 0)
			{
			if (grado <= 45 && grado >= 0)
			control = new Point((inicial.x + terminal.x) / 2 - 10, (inicial.y + terminal.y) / 2 + 50);
			if (grado <= 90 && grado > 45)
			control = new Point((inicial.x + terminal.x) / 2 + 50, (inicial.y + terminal.y) / 2 + 10);
			}
			else
			{
				if (grado >= -45 && grado <= 0)
				control = new Point((inicial.x + terminal.x) / 2 - 30, (inicial.y + terminal.y) / 2 - 10);
				if (grado >= -90 && grado < -45)
				control = new Point((inicial.x + terminal.x) / 2 - 50, (inicial.y + terminal.y) / 2 - 10);
				}
			//
				Point tempInicial = new Point(inicial.x + 5, inicial.y + 5),
					tempFinal = new Point(terminal.x + 5, terminal.y + 5);
					QuadCurve2D.Double quad = new QuadCurve2D.Double();
						quad.setCurve(tempInicial, control, tempFinal);
				g.setColor(aux);
				g.drawString( costo + "", control.x, control.y);
				g.setColor(color);
				g.draw(quad);
			break;

		}//end switch
	}
	/**
	*Retorna la  ubicacion de un punto en la interfaz
	*@return ubucacion del vector en la interfaz
	*/
	public Point getUbicacion(){
		return ubicacionExt;
	}
	/**
	*Retorna la relacion entre los vertices que son graficados
	*@return ubucacion del vector en la interfaz
	*/
	public Relacion getArista(){
		return arista;
	}
	/**
	*Establece la relacion entre los vertices que son graficados
	*@param arista ubucacion del vector en la interfaz
	*/
	public void setArista(Relacion arista){
		this.arista = arista;
	}
	/**
	*Obtieneel color base de todos los vertices graficos
	*@return color de los vertices
	*/
	public Color getColor(){
		color = new Color(0, 128, 128);
		aux = Color.RED;
		return color;
	}
	/**
	*Establece el color base de los nuevos vertices graficos
	*@param color Color 
	*/
	public void setColor(Color color){
		if (color.equals(new Color(0, 128, 128)))
			aux = Color.RED;
		else
			aux = Color.BLUE;
		this.color = color;
	}
}

